package com.atguigu.gmall.pms.service.impl;

import com.alibaba.fastjson.JSON;
import com.atguigu.gmall.pms.vo.ItemSaleAttrVO;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.common.bean.PageResultVo;
import com.atguigu.gmall.common.bean.PageParamVo;

import com.atguigu.gmall.pms.mapper.SkuAttrValueMapper;
import com.atguigu.gmall.pms.entity.SkuAttrValueEntity;
import com.atguigu.gmall.pms.service.SkuAttrValueService;
import org.springframework.util.CollectionUtils;


@Service("skuAttrValueService")
public class SkuAttrValueServiceImpl extends ServiceImpl<SkuAttrValueMapper, SkuAttrValueEntity> implements SkuAttrValueService {

    @Override
    public PageResultVo queryPage(PageParamVo paramVo) {
        IPage<SkuAttrValueEntity> page = this.page(
                paramVo.getPage(),
                new QueryWrapper<SkuAttrValueEntity>()
        );

        return new PageResultVo(page);
    }

    @Override
    public List<SkuAttrValueEntity> listSearchAttrValuesBySkuId(Long skuId) {
        return baseMapper.selectSearchAttrValuesBySkuId(skuId);
    }

    @Override
    public Map<Long, String> querySaleAttrValuesBySkuId(Long skuId) {
        Map<Long, String> saleAttrValues = new HashMap<>();
        /*
        查询sku的销售属性id映射的 销售属性值 集合
         */
        List<Map<String,Object>> maps = baseMapper.selectSaleAttrValuesBySkuId(skuId);
//        List<SkuAttrValueEntity> maps = baseMapper.selectSaleAttrValuesBySkuId(skuId);
        if(CollectionUtils.isEmpty(maps)){
            return null;
        }
        maps.forEach(map->{
            Object attrId = map.get("attr_id");
            Object attrValue = map.get("attr_value");
            saleAttrValues.put((Long)attrId , attrValue.toString());
        });


        return saleAttrValues;
    }

    @Override
    public List<ItemSaleAttrVO> querySkuattrvaluesBySpuId(Long spuId) {
        //查询spuId对应的 所有sku的销售属性 和值
        List<SkuAttrValueEntity> skuAttrValueEntities = baseMapper.selectSkuattrvaluesBySpuId(spuId);
        /*
            机身颜色(3)：  金色   白色
            运行内存(4):   12G
            机身存储(5):  256G  512G
            public class ItemSaleAttrVO {
            //ItemSaleAttrVO的对象 映射skuAttrValueEntities集合中的多行数据,多行数据的attrId相同
                private Long attrId;
                private String attrName;
                private Set<String> attrValues;
            }
         */
        // 根据skuAttrValueEntities集合中所有数据的attrId属性值分组，属性值相同的SkuAttrValueEntity对象会存到一个List集合中
        Map<Long, List<SkuAttrValueEntity>> map = skuAttrValueEntities.stream()
                .collect(Collectors.groupingBy(SkuAttrValueEntity::getAttrId));
        List<ItemSaleAttrVO> itemSaleAttrVOS = new ArrayList<>();
        map.forEach((attrId,attrValues)->{
            ItemSaleAttrVO itemSaleAttrVO = new ItemSaleAttrVO();
            itemSaleAttrVO.setAttrId(attrId);
            itemSaleAttrVO.setAttrName(attrValues.get(0).getAttrName());
            itemSaleAttrVO.setAttrValues(attrValues.stream().map(SkuAttrValueEntity::getAttrValue)
                .collect(Collectors.toSet()));
            itemSaleAttrVOS.add(itemSaleAttrVO);
        });
        return itemSaleAttrVOS;
    }

    @Override
    public String querySkuJsonsBySpuId(Long spuId) {
        //参考querySkuattrvaluesBySpuId查询spu下所有的sku的销售属性和值 对象集合
        //通过业务代码  组合数据
        //[{"attr_id":3 , "attr_values":"白色,12G,256G"}]
        List<Map<String,Object>> list = baseMapper.selectSkuJsonsBySpuId(spuId);
        Map<String , String>  skuAttrs = new HashMap<>();
        //[{'白色,12G,256G': '1624314367975636993'}]
        list.forEach(map->{
            Object attrId = map.get("sku_id");
            Object attrValues = map.get("attr_values");
            skuAttrs.put(attrValues.toString() , attrId.toString());
        });
        // json格式： {"属性名":true/false/1234/"1234"}
        return JSON.toJSONString(skuAttrs);
    }

}